﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;


namespace Despertador
{
    class Program
    {
        static int contador = 0;
        static List<Alarme> listaAlarmes = new List<Alarme>();
        private static System.Timers.Timer aTimer;

        static void Main(string[] args)
        {
            //instancia o timer
            aTimer = new System.Timers.Timer();

            /*    
             * Liga o evento Elapsed  para o timer com nome do metodo 
             * a ser implementado quando ocerrer o evento.
             */
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

            // Atribui o intervalo de 1 segundo (1000 milisegundos).
            aTimer.Interval = 1000;
            aTimer.Enabled = true;


            while (true)
            {
                #region Menu
                int opcao;

                Console.WriteLine("Menu alarme\n\n" +
                  "Digite a Opcao desejada\n\n" +
                  "1- Cadastar Alarme\n" +
                  "2- Alterar informações de um alarme cadastrado\n" +
                  "3- Remover alarme\n" +
                  "4- Listar todos os alarmes cadastrados\n" +
                  "0- Sair\n\n");
                Console.Write(">");

                /*tenta converter para inteiro*/
                try
                {
                    opcao = int.Parse(Console.ReadLine());
                }
                catch // No C# posso colocar o catch sem Exeption declarado;
                {
                    Console.Clear();

                    Console.WriteLine("! Digite somente caracteres numericos !\n \n" +
                                      "Pessione qualquer tecla para voltar ao menu...");
                    Console.ReadKey();
                    Console.Clear();

                    continue;
                }

                #endregion                //CONDICOES PARA O MENU
                switch (opcao)
                {
                    case 1:
                        #region Criar um Alarme

                        Console.Clear();
                        Console.WriteLine("Digite a hora no formato hh:mm:ss 24h");

                        string hora = Console.ReadLine();

                        if (!Validacoes.validaHora(hora))
                        {
                            Console.Clear();
                            Console.WriteLine("! Hora incorreta, digite uma hora válida no formato HH:MM:SS 24H!");
                            Console.ReadKey();
                            Console.Clear();
                            break;
                        }

                        Console.WriteLine("Digite a descrião e alarme");
                        string descricao = Console.ReadLine();

                        Console.Clear();
                        Console.WriteLine("Repetir Alarme ?\n\n" +
                                          "0 - Não repetir\n" +
                                          "1 - Domingos\n" +
                                          "2 - Segundas-Feiras\n" +
                                          "3 - Terças-Feiras\n" +
                                          "4 - Quartas-Feiras\n" +
                                          "5 - Quintas-Feiras\n" +
                                          "6 - Sextas-Feiras\n" +
                                          "7 - Sabados\n" +
                                          "8 - Todos os Dias\n" +
                                          "9 - De Segunda a Sexta\n\n");
                        Console.Write(">");

                        int diaSemana = Validacoes.validaDia(Console.ReadLine());

                        if (diaSemana > 9)
                        {
                            Console.Clear();
                            Console.WriteLine("! Opção invalida !");
                            Console.Clear();
                            Console.ReadKey();
                            break;
                        }

                        Alarme a = new Alarme();

                        a.codigo = contador;
                        contador++;
                        a.hora = hora;
                        a.descricao = descricao;
                        a.dia = diaSemana;
                        listaAlarmes.Add(a);

                        Console.Clear();
                        Console.WriteLine("Alarme salvo com sucesso !");
                        Console.WriteLine("Pressione qualquer tecla para voltar ao menu...");
                        Console.ReadKey();
                        Console.Clear();
                        #endregion
                        break;
                    case 2:
                        #region Alterar um alarme
                        Console.Clear();

                        #endregion
                        break;
                    case 3:
                        #region Remover um alarme
                        Console.Clear();

                        Console.WriteLine("Digite o codigo do alarme");

                        #endregion
                        break;
                    case 4:
                        #region Listar alarmes
                        Console.Clear();

                        foreach (Alarme alarme in listaAlarmes)
                        {
                            Console.WriteLine("Codigo do alarme: " + alarme.codigo);
                            Console.WriteLine("Horário do alarme: " + alarme.hora);
                            Console.WriteLine("Descrição de alarme: " + alarme.descricao);
                            string aux = (alarme.dia == 0) ? "Não" : (alarme.dia == 1) ? "Domingo" : (alarme.dia == 2) ? "Segunda" : (alarme.dia == 3) ? "Terça" : (alarme.dia == 4) ? "Quarta" : (alarme.dia == 5) ? "Quinta" : (alarme.dia == 6) ? "Sexta" : (alarme.dia == 7) ? "Sábado" : (alarme.dia == 8) ? "Todos os dias" : (alarme.dia == 9) ? "Segunda a Sexta" : "";
                            Console.WriteLine("Repetir: " + aux);
                            Console.WriteLine();
                        }

                        Console.ReadKey();
                        Console.Clear();
                        #endregion
                        break;
                    case 0:
                        Environment.Exit(0);
                        break;
                    default:
                        #region quando a opcao noa existir
                        Console.Clear();

                        Console.WriteLine("!A opcao que deseja nao existe!\n\n" +
                                          "Pessione qualquer tecla para voltar ao menu...");
                        Console.ReadKey();

                        Console.Clear();
                        #endregion
                        break;
                }
            }


        }
        /*evento tick, acada intervalo definido este metodo e executado*/
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {

            int tmpHora;
            int tmpMinuto;
            int tmpSegundo;


            for (int i = 0; i < listaAlarmes.Count; i++)
            {
                tmpHora = int.Parse(listaAlarmes.ElementAt(i).hora.Substring(0, 2));
                tmpMinuto = int.Parse(listaAlarmes.ElementAt(i).hora.Substring(3, 2));
                tmpSegundo = int.Parse(listaAlarmes.ElementAt(i).hora.Substring(6, 2));

                if (tmpHora == e.SignalTime.Hour && tmpMinuto == e.SignalTime.Minute && tmpSegundo == e.SignalTime.Second)
                {

                    if (listaAlarmes.ElementAt(i).dia == 0)
                    {
                        listaAlarmes.RemoveAt(i);
                    }

                    for (int j = 0; j < 10; j++)
                    {
                        Console.Beep();
                    }
                }

            }



        }
    }
}
